package br.org.acessobrasil.portal.action.itemConteudo;

import java.util.ArrayList;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

import br.com.goals.tableedit.util.Conversor;
import br.org.acessobrasil.portal.Gerenciador;
import br.org.acessobrasil.portal.controle.SecurityManager;
import br.org.acessobrasil.portal.modelo.ConteudoFormatado;
import br.org.acessobrasil.portal.modelo.ItemConteudo;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.vista.FormularioItemConteudo;

@Transactional
public class EditarItemConteudoAction extends BaseItemConteudo{
	private static final long serialVersionUID = -1227649732044102359L;
	private static Logger logger = Logger.getLogger(EditarItemConteudoAction.class);
	public EditarItemConteudoAction() {
	}
	
	@Override
	public String execute() throws Exception {
		Usuario usuario = getUsuarioLogado();
		try{
			ItemConteudo itemConteudoOriginal = getItemConteudoFacade().buscar(usuario, this.getItemConteudo().getNuItemConteudo());
			//ItemConteudo itemConteudoOriginal = itemConteudoDao.select();
			if(!SecurityManager.podeAlterarItemConteudo(usuario, itemConteudoOriginal)){
				usuario.addActionError("Voc&eacute; n&atilde;o possui autoriza&ccedil;&atilde;o para editar este conte&uacute;do.");
				return SUCCESS;
			}
			{//verificar se o item pertence ao site de trabalho atual
				Sitio sitio = super.getSitioAtual();
				if(itemConteudoOriginal.getConteudo()!=null && itemConteudoOriginal.getConteudo().getPagina()!=null && itemConteudoOriginal.getConteudo().getPagina().getSitio()!=null){
					if(sitio==null || !sitio.getNuSitio().equals(itemConteudoOriginal.getConteudo().getPagina().getSitio().getNuSitio())){
						sitio = itemConteudoOriginal.getConteudo().getPagina().getSitio();
						super.setSitioAtual(sitio);
						usuario.addActionMessage(getText("aviso.sitiodetrabalhoalterado")+sitio.getNoSitio());
					}
				}
			}//fim verificar se o item pertence ao site de trabalho atual
			if(isPosted()){
				//postou algo no formulario
				String redireciona = estaIncluindoImagem();
				if (redireciona!=null) {
					// est� incluindo um item de imagem, flash, etc
					redirecionar(redireciona);
				}else{
					//atualizar
					//bloquear caso o item seja de backup
					if(itemConteudoOriginal.getStSituacao()=='b'){
						usuario.addActionError("Este item &eacute; somente de backup.");
					}else{
						if(itemConteudoOriginal.getStSituacao()=='p'){
							//esta publicado, criamos uma nova versao
							if(getBtnSalvarPublicar()!=null){
								atualizar(itemConteudoOriginal);
							}else{
								salvarVersao(itemConteudoOriginal);
							}
						}else{
							if(getBtnSalvarPublicar()!=null){
								itemConteudoOriginal.setStSituacao('p');
							}
							//atualizar
							atualizar(itemConteudoOriginal);
						}
					}
				}
			}else if(escolhendo==1){
				montarFormularioArquivoEscolhido("editarItemConteudo.action");
			}else{
				//carregar o item
				setItemConteudo(itemConteudoOriginal);
				avaliarAcessibilidade(itemConteudoOriginal);
				String formulario;
				if(usuario.isModoDesenvolvimento()){
					formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudoOriginal,"editarItemConteudo.action",true);
				}else{
					formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudoOriginal,"editarItemConteudo.action",false);
				}
				formulario += gerarHtmlRelatorio(itemConteudoOriginal);
				setFormEditar(formulario);
			}
		}catch(Exception e){
			usuario.addActionError(e.getMessage());
			logger.error("Erro ao editar item de conteudo",e);
		}
		return SUCCESS;
	}
	
	/**
	 * Cria uma versao nova a partir do ItemConteudo passado
	 * @param itemConteudoOriginal item do qual se ira criar uma nova versao
	 * @throws Exception
	 */
	private void salvarVersao(ItemConteudo itemConteudoOriginal) throws Exception{
		ItemConteudo itemConteudo = null;
		Usuario usuario =getUsuarioLogado();
		
		itemConteudo = parsePost(getRequest());
		if(!SecurityManager.podeAlterarItemConteudo(usuario, itemConteudo)){
			setMensagem("Voc&eacute; n&atilde;o possui autoriza&ccedil;&atilde;o para editar este conte&uacute;do.");
			return;
		}
		getItemConteudoDaoTemp().apagar(itemConteudo);
		
		getItemConteudoFacade().salvarVersao(usuario,itemConteudoOriginal,itemConteudo);
		
		Gerenciador.limparCache();
		//gerar o formulario de edicao
		String formulario;
		if(getUsuarioLogado().isModoDesenvolvimento()){
			formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudo,"editarItemConteudo.action",true);
		}else{
			formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudo,"editarItemConteudo.action",false);
		}
		formulario += gerarHtmlRelatorio(itemConteudo);
		setFormEditar(formulario);
		setItemConteudo(itemConteudo);
	}
	
	/**
	 * Valida a acessibilidade tambem
	 * @param itemConteudo objeto para salvar
	 * @throws Exception algum erro
	 */
	private void atualizar(ItemConteudo itemConteudo) throws Exception{
		Usuario usuario = getUsuarioLogado();
		getItemConteudoDaoTemp().apagar(itemConteudo);
		boolean possuiErros = false;
		{// Tratamento do request
			HttpServletRequest request = getRequest();
			long nu_conteudo = Long.parseLong(request.getParameter("conteudo.nuConteudo"));
			br.org.acessobrasil.portal.modelo.Conteudo conteudo = getItemConteudoFacade().buscarConteudo(nu_conteudo);
			
			if(!SecurityManager.podeAlterarItemConteudo(usuario, itemConteudo)){
				usuario.addActionError("Voc&eacute; n&atilde;o possui autoriza&ccedil;&atilde;o para alterar este conte&uacute;do.");
				return;
			}
			itemConteudo.setAlteradoNuUsuario(usuario.getNuUsuario());
			itemConteudo.setDtAlteracao(new Date());
			itemConteudo.setNuConteudo(nu_conteudo);
			itemConteudo.setNoTitulo(request.getParameter("no_titulo"));
			String erro = "";
			try{
				if(conteudo.getTipoConteudo().getPossuiPreco()==1){//verifica se o item deve conter o preco
					if(request.getParameter("preco")==null){
						erro="O campo pre&ccedil;o &eacute; obrigat&oacute;rio";
						throw new Exception(erro);
					}else{
						erro="Digite corretamente o pre&ccedil;o";
						itemConteudo.setPreco(Double.parseDouble(request.getParameter("preco")));
					}
				}
				erro = "Digite corretamente a data de publica&ccedil;&atilde;o.";
				itemConteudo.setDtParaPublicacao(Conversor.converteDDMMYYYY(request.getParameter("dt_para_publicacao")));
				erro = "Digite corretamente a data para retirada do ar.";
				itemConteudo.setDtParaRetirada(Conversor.converteDDMMYYYY(request.getParameter("dt_para_retirada")));
			}catch(NumberFormatException e){
				usuario.addActionError(erro);
				possuiErros = true;
			}catch(Exception e){
				usuario.addActionError(erro);
				possuiErros = true;
			}
			for (br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo info : conteudo.getTipoConteudo().getListInformacaoTipoConteudo()) {
				erro = "Preencha corretamente o campo '" + info.getNoInformacao() + "'.";
				try{
					long nu_informacao_tipo_conteudo = info.getNuInformacaoTipoConteudo();
					String campoNome = "info" + nu_informacao_tipo_conteudo;
					String valor = request.getParameter(campoNome);
		
					if (valor == null && !info.getCoAtivo()) {
						// desabilitado e com valor null
						continue;
					}
					// est� habilitado ou o valor n�o � null
					boolean existe = false;
					for (ConteudoFormatado conteudoFormatado : itemConteudo.getListConteudoFormatado()) {
						if (conteudoFormatado.getNuInformacaoTipoConteudo() == nu_informacao_tipo_conteudo) {
							if(info.getFormato()==null){
								logger.error("info.getFormato() == null id = " + info.getNuFormato());
							}
							if (info.getFormato().getClassName().equals("java.sql.Date")) {
								String val = Conversor.converteDDMMYYYY(valor).toString();
								conteudoFormatado.setDeConteudo(val);
							} else {
								if(valor.equals(info.getDeDicaPreenchimento())) valor="";
								conteudoFormatado.setDeConteudo(valor);
							}
							existe = true;
						}
					}
					if (!existe) {
						ConteudoFormatado conteudoFormatado = new ConteudoFormatado();
						if (info.getFormato().getClassName().equals("java.sql.Date")) {
							String val = Conversor.converteDDMMYYYY(request.getParameter(campoNome)).toString();
							conteudoFormatado.setDeConteudo(val);
						} else {
							conteudoFormatado.setDeConteudo(request.getParameter(campoNome));
						}
						conteudoFormatado.setNuInformacaoTipoConteudo(nu_informacao_tipo_conteudo);
						conteudoFormatado.setNuItemConteudo(itemConteudo.getNuItemConteudo());
						conteudoFormatado.setNuConteudoFormatado(0L);
						ArrayList<ConteudoFormatado> arrConteudoFormatado = (ArrayList<ConteudoFormatado>) itemConteudo.getListConteudoFormatado();
						arrConteudoFormatado.add(conteudoFormatado);
					}
				}catch(Exception e){
					usuario.addActionError(erro);
					logger.error("Erro com um campo ",e);
					possuiErros = true;
				}
			}
		}// Fim do tratamento do request
		
		if(!possuiErros){
			getItemConteudoFacade().atualizar(usuario, itemConteudo);
		}
		setUsuarioLogado(usuario);
		/*
		boolean ok = avaliarAcessibilidade(itemConteudo); 
		if(!ok){
			itemConteudo.setStSituacao('a');
		}
		if(!possuiErros){
			if(itemConteudo.getStSituacao()=='a' && ok){
				//se nao possui erros e a situacao estava errada, volta para rascunho
				itemConteudo.setStSituacao('r');
			}
			itemConteudoDao.update(itemConteudo);
			addActionMessage("Atualizado com sucesso!");
			Gerenciador.limparCache();
			String msg="Item de Conte�do Editado com sucesso. ['"+itemConteudo.getNoTitulo()+"',id = "+itemConteudo.getNuItemConteudo()+"].";
			logDao.addLog(usuario,msg);
		}
		*/
		//gerar o formulario de edicao
		String formulario;
		if(getUsuarioLogado().isModoDesenvolvimento()){
			formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudo,"editarItemConteudo.action",true);
		}else{
			formulario = FormularioItemConteudo.gerarFormularioHtml(itemConteudo,"editarItemConteudo.action",false);
		}
		formulario += gerarHtmlRelatorio(itemConteudo);
		setFormEditar(formulario);
		setItemConteudo(itemConteudo);
	}
}
